package org.origin.centre.support.utils;

import java.util.Collection;
import java.util.Map;

/**
 * Map 工具类
 *
 * @author ferret
 * @version 2024-05-08
 */
@SuppressWarnings("unused")
public final class MapUtil {

    /**
     * 通过key获取map中的值
     *
     * @param map source
     * @param key 键
     */
    public static <T> T get(Map<?, T> map, Object key) {
        if (map != null) {
            return map.get(key);
        }
        return null;
    }

    /**
     * 通过key获取map中的值并符合 String 类型
     *
     * @param map source
     * @param key 键
     */
    public static <T> String getString(Map<?, T> map, Object key) {
        T val = get(map, key);
        if (val != null) {
            return val.toString();
        }
        return null;
    }

    /**
     * 通过key获取map中的值并符合 String 类型
     *
     * @param map source
     * @param key 键
     */
    public static <T> String getString(Map<?, T> map, Object key, String defaultVal) {
        T val = get(map, key);
        if (val != null) {
            String s = val.toString();
            if (BasicUtil.isNotBlank(s)) {
                return s;
            }
        }
        return defaultVal;
    }

    /**
     * 通过key获取map中的值并符合 Integer 类型
     *
     * @param map source
     * @param key 键
     */
    public static <T> Integer getInteger(Map<?, T> map, Object key) {
        T val = get(map, key);
        if (val != null) {
            if (val instanceof Integer) {
                return (Integer) val;
            } else if (val instanceof Number) {
                return ((Number) val).intValue();
            } else if (val instanceof String) {
                return Integer.parseInt((String) val);
            }
        }
        return null;
    }

    /**
     * 通过key获取map中的值并符合 Integer 类型
     *
     * @param map source
     * @param key 键
     */
    public static <T> Integer getInteger(Map<?, T> map, Object key, Integer defaultVal) {
        T val = get(map, key);
        if (val != null) {
            if (val instanceof Integer) {
                return (Integer) val;
            } else if (val instanceof Number) {
                return ((Number) val).intValue();
            } else if (val instanceof String) {
                return Integer.parseInt((String) val);
            }
        }
        return defaultVal;
    }

    /**
     * 通过key获取map中的值并符合 Long 类型
     *
     * @param map source
     * @param key 键
     */
    public static <T> Long getLong(Map<?, T> map, Object key) {
        T val = get(map, key);
        if (val != null) {
            if (val instanceof Long) {
                return (Long) val;
            } else if (val instanceof Number) {
                return ((Number) val).longValue();
            } else if (val instanceof String) {
                return Long.parseLong((String) val);
            }
        }
        return null;
    }

    /**
     * 通过key获取map中的值并符合 Long 类型
     *
     * @param map source
     * @param key 键
     */
    public static <T> Long getLong(Map<?, T> map, Object key, Long defaultVal) {
        T val = get(map, key);
        if (val != null) {
            if (val instanceof Long) {
                return (Long) val;
            } else if (val instanceof Number) {
                return ((Number) val).longValue();
            } else if (val instanceof String) {
                return Long.parseLong((String) val);
            }
        }
        return defaultVal;
    }

    /**
     * 通过key获取map中的值并符合 getBoolean 类型
     *
     * @param map source
     * @param key 键
     */
    public static <T> Boolean getBoolean(Map<?, T> map, Object key) {
        T val = get(map, key);
        if (val != null) {
            return val.toString().equals("true");
        }
        return null;
    }

    /**
     * 通过key获取map中的值并符合 getBoolean 类型
     *
     * @param map source
     * @param key 键
     */
    public static <T> Boolean getBoolean(Map<?, T> map, Object key, Boolean defaultVal) {
        T val = get(map, key);
        if (val != null) {
            return val.toString().equals("true");
        }
        return defaultVal;
    }

    /**
     * 通过key获取map中的值并符合 Bool 类型
     *
     * @param map source
     * @param key 键
     */
    public static <T> boolean getBool(Map<?, T> map, Object key) {
        T val = get(map, key);
        if (val != null) {
            return val.toString().equals("true");
        }
        return false;
    }

    /**
     * 通过key获取map中的值并符合 Bool 类型
     *
     * @param map source
     * @param key 键
     */
    public static <T> boolean getBool(Map<?, T> map, Object key, boolean defaultVal) {
        T val = get(map, key);
        if (val != null) {
            return val.toString().equals("true");
        }
        return defaultVal;
    }

    /**
     * 通过key获取map中的值并符合 Bool 类型
     *
     * @param map source
     * @param key 键
     */
    public static <T> Collection<?> getCollection(Map<?, T> map, Object key) {
        T val = get(map, key);
        if (val != null) {
            if (val instanceof Collection) {
                return (Collection<?>) val;
            }
        }
        return null;
    }

}
